
14.06.2016, 21:00
|
Интересующийся
|
|
Регистрация: 11.09.2012
Сообщений: 11
|
|
AJAX не модифицирует глобальные и внешние переменные
Допустим, есть глобальная переменная
var j = {};
И есть AJAX запрос
function nnn () {
....
$.ajax ({
method: "GET",
url: "../locale/forms.json",
dataType: "json",
error: function (jqxhr, status, errorMsg) {
console.log("status: " + jqxhr.status + ", " + errorMsg + "; " + jqxhr.responseText);
console.trace();
console.dir();
},
success: function (data) {
j["estimates"] = "test";
console.log ("IN = " + j["estimates"]);
}
});
....
Есть еще в той же функции вывод в лог после AJAX
console.log ("AFTER: " + j["estimates"]);
В итоге в логе видим
AFTER: undefined
IN = test
мало того, что последовательность нарушена, так еще и откатывается любое изменение внешней переменной, созданной не в AJAX, после завершения AJAX.
Как можно решить эту проблему? Требуется загрузить с сервера данные в JSON формате в соответствующий объект, чтобы потом МНОГОКРАТНО его использовать.
Последний раз редактировалось reno4, 14.06.2016 в 21:43.
|
|

14.06.2016, 21:39
|
 |
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
var v = {};
// ...........
v["estimates"] = "test";
|
|

14.06.2016, 21:46
|
Интересующийся
|
|
Регистрация: 11.09.2012
Сообщений: 11
|
|
Сообщение от Poznakomlus
|
var v = {};
// ...........
v["estimates"] = "test";
|
В реальности перепробовал множество вариантов и тестов, ничего не помогает. Если внутри AJAX присваиваю переменной любое значение, то это значение не видно снаружи. Ваш вариант я, естественно, тоже пробовал.
Кроме того еще пробовал создавать объект JQuery и затолкать значение в него, но если он не был прицеплен к DOM, то при выходе из AJAX это значение терялось.
У кого какие мысли есть по этому поводу?
Последний раз редактировалось reno4, 14.06.2016 в 21:51.
|
|

15.06.2016, 01:25
|
 |
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
reno4 не будь инопланетянином
success: function (data) {
console.log(data); // 'этот ответ придет асинхронно по умолчанию, то есть через время
}
|
|

15.06.2016, 01:39
|
Интересующийся
|
|
Регистрация: 11.09.2012
Сообщений: 11
|
|
Сообщение от Poznakomlus
|
reno4 не будь инопланетянином
success: function (data) {
console.log(data); // 'этот ответ придет асинхронно по умолчанию, то есть через время
}
|
Вы хотите сказать, что такого способа передать значение из AJAX внешней переменной не существует в принципе??
Но ведь тот же плагин DataTables как-то передает значения из AJAX в свои внешние переменные!
|
|

15.06.2016, 02:15
|
 |
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
вы просто не хотите понять, что переменная изменится, но через время :-)
так как по умолчанию ajax запросы асинхронны
Цитата:
|
По умолчанию, все запросы без перезагрузки страницы происходят асинхронно (то есть после отправки запроса на сервер, страница не останавливает свою работу в ожидании ответа). Если вам понадобиться синхронное выполнение запроса, то установите параметр в false. Кроссдоменные запросы и запросы типа "jsonp" не могут выполняться в синхронном режиме.
Имейте ввиду, что выполнение запросов в синхронном режиме может привести к блокировке страницы, пока запрос не будет полностью выполнен.
|
можете убедиться добавив
async: false,
|
|

15.06.2016, 04:12
|
Интересующийся
|
|
Регистрация: 11.09.2012
Сообщений: 11
|
|
Сообщение от Poznakomlus
|
вы просто не хотите понять, что переменная изменится, но через время :-)
так как по умолчанию ajax запросы асинхронны
можете убедиться добавив
async: false,
|
Убедился, спасибо. А как же тогда быть с получением в формате JSON ассоциативного массива, точнее, с записью его в объект-переменную? Не ставить же из-за этого синхронный режим, коряво как-то будет. А процедура, создающая у меня форму на основании этого массива, если не получит своевременно данные, не сможет создать форму. Какие на этот счет есть способы решения, не в курсе?
|
|

15.06.2016, 05:36
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от reno4
|
процедура, создающая у меня форму на основании этого массива, если не получит своевременно данные, не сможет создать форму
|
Надо полагать, что в этом случае форма создается по требованию и на время, так значит и создавать ее нужно сразу после запроса, а процедура, это и будет функция success Ajax.
|
|

15.06.2016, 15:30
|
Интересующийся
|
|
Регистрация: 11.09.2012
Сообщений: 11
|
|
Сообщение от laimas
|
Надо полагать, что в этом случае форма создается по требованию и на время, так значит и создавать ее нужно сразу после запроса, а процедура, это и будет функция success Ajax.
|
Форм много и каждая из них создается неоднократно. И вы предлагаете мне каждый раз дергать при этом AJAX, нагружая сразу 2 сервера лишними запросами? Умножим это на многотысячное количество пользователей. Получим ощутимые дополнительные тормоза, которых могло бы и не быть.
Я уже рассматривал ваш подход в самом начале и от него пришлось отказаться по указанной выше причине. Нужно именно МНОГОКРАТНОЕ использование полученных данных.
|
|

15.06.2016, 15:37
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от reno4
|
Форм много и каждая из них создается неоднократно. И вы предлагаете мне каждый раз дергать при этом AJAX, нагружая сразу 2 сервера лишними запросами?
|
Меняйте логику, кто же вам запрещает. Я не предлагаю дергать, я вообще не знаю, сколько у вас форм, с какой кучи серверов они запрашиваются, но уж коли так, то почему их не приготовить сразу при загрузке страницы, если уж именно МНОГОКРАТНОЕ использование полученных данных?
|
|
|
|